git bisect
commitを辿って問題の原因となったcommitを突き止めるやつ
あれ、前まで動いてたのに、今見たら動かんくなってる、、どこが原因や??ってときに使う
$ git bisect
test codeのexamplesも載ってる
①最初にやること
念の為、一度bisectのresetをしておく
$ git bisect reset develop
とりあえず「問題ありコミット」と「問題なかったときコミット」を突き止める
$ git bisect start <bad-commit> <good-commit>
badの方が最近でないとエラーになる
badとgoodの順番毎回忘れるし、自動でやってくれればいいのにねmrsekut.icon
e.g.
$ git bisect start @ 1e3131
②次に取る方法としては2つある(どちらかのみでいい)
②-1 テストスクリプトを用いるもの
自動的にテストしていき、テストが通るものを突き止めてくれる
$ git bisect run ./test-script.sh
②-2 自分でgood or badを付けていく
$ git bisect good
$ git bisect bad
を実行すると自動的に真ん中のcommitをcheckoutしてくれる
テストコードを用意する
code:test-bisect.sh
npm i
npm run build
status=$?
git reset --hard
exit $status
↑これは、大きめのリニューアル時に、localでのnext.jsのbuildがいつからか失敗するようになったので突き止めるために書いたコードmrsekut.icon
status明示しないとなんかちゃんと動かなかった(全部成功してしまった)
このようにテストコードの中でnpm iなどをしていると、
package-lock.jsonが作成され、conflictするなどして途中で止まっちゃう
最初からやり直しになるわけではないが、失敗するたびに手動でgit stashなり、git resetなりしないといけないのでダルい
なので、テストコードの最後にgit reset --soft headとか書いとくと良いかも
code:error
error: Your local changes to the following files would be overwritten by checkout:
package-lock.json
Please commit your changes or stash them before you switch branches.
Aborting
Bisecting: 22 revisions left to test after this (roughly 5 steps)
bisect run failed:
'bisect_state good' exited with error code 1
$ chmod +x test-bisect.sh
$ git bisect run ./test-bisect.sh
自動的に真ん中がcheckoutされるので、動くかどうかを確認して以下のいずれかを実行する
$ git bisect good
$ git bisect bad
を実行すると自動的に真ん中のcommitをcheckoutしてくれる
最終的に原因を突き止めてこう言ってくる
code:shell
b5227246246cc67587489ccb899731f928 is the first bad commit
commit b5227246246cc67587489ccb899731f928
Author: mrsekut <example@example.com>
Date: Wed Jan 8 15:32:37 2020 +0900
$ git bisect reset <commit>
元の状態に戻す
e.g. $ git bisect reset head
毎回ちゃんとやる必要がある
昔のbisectをresetし忘れている状態で新たにbisect startしようとすると以下のようなエラーが出た
code:error
fatal: invalid reference: ft-mrsekut-hogehoeg
error: could not check out original HEAD 'ft-mrsekut-piyopiyo'. Try 'git bisect reset <commit>'.
現在チェックアウトしているコミットを確認する
$ git bisect view
二分探索の過程を確認する
$ git bisect log
branchまたいだらできないのか